/**********************************************************************************************************************
 * @file    qlmodemdef.h
 * @author  Queclink Hubert.Lee
 * @date    2018-04-03
 * @brief   Queclink FreeRTOS Software Development Kit data structure definition.
 *
 * Copyright (C) 2018 Queclink Wireless Solutions (ShenZhen) Co., Ltd. All Rights Reserved.
 *
 * @attention
 *
 * @usage
 *
 *********************************************************************************************************************/


#ifndef __QLMODEMDEF_H
#define __QLMODEMDEF_H

/* includes ---------------------------------------------------------------------------------------------------------*/
/* Please use #include <FreeRTOS.h> to include this file. */
#include <stddef.h>
#include <stdbool.h>

//#include "FreeRTOS.h"
//#include "task.h"

#ifdef __cplusplus
extern "C" {
#endif



#ifndef _SSIZE_T
#define _SSIZE_T
typedef signed int ssize_t;
#endif /* _SSIZE_T */

typedef void (*voidfunc_t)(void);

#ifndef qlmalloc
#define qlmalloc(size)     pvPortMalloc(size)
#define qlfree(ptr)        vPortFree(ptr)
#endif

extern const char * const qlmodem_version;

/* Network Friendly Mode arguments,
 * 更多信息见 qlsdk/task_modem.h 说明. */
typedef unsigned short nfm_arguments[8];

struct modem_conf {
    const struct modem_pins *pins;              /* MODEM脚控制接口 */
    const struct modem_uart *uart;              /* MODEM串口操作接口 */
    const struct modem_mgr  *mgr;               /* MODEM用户管理接口 */
    unsigned int            baud;               /* MCU与MODEM通信波特率, 单位bps */
    unsigned char           pwroff_time;        /* 硬件控制从断开MODEM电源后到闭合MODEM电源所需延迟的时间, 单位s */
    unsigned char           pwron_time;         /* 硬件控制从闭合MODEM电源后到MODEM电源稳定所需延迟的时间, 单位s */
    bool                    creg_urc_en;        /* CREG URC 开关, 参见 QLSDK_MODEM_CREG_URC_USE 宏 */
    unsigned short          rssi_timeout;       /* RSSI 持续弱时间, 参见 QLSDK_MODEM_CSQ_WEAK_TIMEOUT 宏 */
    const nfm_arguments     *nfm_args;          /* Network Friendly Mode arguments */
    bool                    hot_plug_en;        /* 热插拔功能开关, 参见 QLSDK_MODEM_SIM_HOT_SWAP_LEVEL */
    int                     modem_priority;     /* 配置modem  任务优先级 默认:3 */
};

struct modem_pin_if {
    const struct sim_pin_mgr    *mgr;
};

struct modem_ntp_if {
    const char      *server;        /* NTP服务器, 字符串 */
    unsigned short  port;           /* NTP服务器端口号 */
};

struct modem_wifi_if {
    void (*config)(void *);         /* 配置WIFI */
    void (*enable)(void);           /* 打开WIFI */
    void (*disable)(void);          /* 关闭WIFI */
    void (*reset)(void);            /* 恢复默认 */
    void (*process)();              /* 事件处理 */
    void (*clean)(void);            /* 清除WIFI状态 */
    void (*client_update)(char *mac, bool connect);     /* 客户端连接状态更新 */
    int  (*get_client_cnt)(void);   /* 获取已连接的客户端个数 */
};

struct modem_sms_if {
    int (*initial)(void);           /* 初始化 */
    int (*send)(const char *phone, const char *sms, int size, char type);    /* 发送短信入列 */
    void (*process)(void);          /* 短信事件处理 */
    bool (*is_idle)(void);          /* 短信事件是否空闲 */
    void (*release)(void);          /* 释放资源 */
};

struct modem_download_if {
    int (*enc_check)(void* param);          /* enc 文件兼容性检查 */
    //reserved

};

struct modem_gnss_if {
    int  (*config)(const void *);   /* 配置GNSS */
    int  (*enable)(void);           /* 打开GNSS */
    int  (*disable)(void);          /* 关闭GNSS */
    void (*process)(void);          /* 事件处理 */
    void (*selt_awake)(void);       /* 自唤醒 */
};

struct modem_ble_if {
    int  (*config)(const void *);   /* 配置BLE */
    int  (*enable)(void);           /* 打开BLE */
    int  (*disable)(void);          /* 关闭BLE */
    void (*process)(void);          /* 事件处理 */
    void (*selt_awake)(void);       /* 自唤醒 */
};


/* MODEM task operation table
 * 用于设计与用户配置相关的功能模块,一般各个功能模块的代码量偏大(1KB以上),
 * 使用函数指针的方式设计,保证不会由于用户的配置不同而链接过多的冗余代码,
 * 可以积极地控制程序的代码尺寸.
 */
struct qltask_modem_ops_t {
  #ifdef QLSDK_LEGACY_USE
    int                     (*manual_reg)(void);/* 手动注册网络功能 */
  #else
    struct opr_manual_mgr   *manual_if;         /* 手动选择运营商功能 */
  #endif
    int                     (*auto_baud)(void); /* 使用 MODEM波特率自适应 */
    struct modem_pin_if     *pin_if;            /* SIM卡PIN码功能 */
    struct modem_ntp_if     *ntp_if;            /* NTP(network time protocol) 功能 */
    struct modem_wifi_if    *wifi_if;           /* WIFI功能 */
    struct modem_sms_if     *sms_if;            /* 短信功能 */

    struct modem_download_if *dl_if;            /* 下载功能 */
    struct modem_gnss_if     *gnss_if;          /* gnss功能 */
    struct modem_ble_if      *ble_if;           /* ble功能 */
    struct sim_switch_mgr    *simsw_if;         /* SIM切换功能 */

};


#ifdef __cplusplus
}
#endif

#endif /* __QLMODEMDEF_H */
